home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #14 / Monster Media No. 14 (April 1996) (Monster Media, Inc.).ISO / netmail / yep13.zip / YEP.DOC < prev    next >
Text File  |  1996-02-13  |  25KB  |  564 lines

  1. Y              E              P
  2.  
  3. Yarn Editor  Pre/Post Processor
  4.  
  5. Y              E              P
  6.  
  7. Version 1.3
  8.  
  9. Contents:
  10. ~~~~~~~~
  11.         -1- Introduction to Yep
  12.         -2- Installation of Yep
  13.         -3- Tags & Substitution
  14.         -4- Yep Operation Notes
  15.                 - . Translation
  16.                 - Mailing Lists
  17.                 - SIG-gy Tricks
  18.         -5- Of Conditional Tags
  19.         *6* History of Revision
  20.         -7- Credits & Apologies
  21.  
  22.  
  23.  
  24. -1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-
  25. Introduction to Yep:
  26. -------------------
  27.  
  28.    Yep is an "editor shell" for use specifically with the Yarn off-line
  29.    newsreader (OS/2 version). It provides the following functionality:
  30.  
  31.         - Start your editor with the first line number past the message
  32.           header, or quotes in a reply, (if your editor supports it)
  33.         - Append your own lines to message headers.
  34.         - Embedded macro tags at any point can:
  35.                 - import random lines of text (suitable for taglines,
  36.                         SIG lines, random header messages, etc)
  37.                 - import files automatically into messages.
  38.                 - import random files (ie. useful for random SIGs)
  39.                 - execute programs (useful to create macros which
  40.                         automatically import the text output of
  41.                         a program)
  42.                 - conditionally do/print things based on current
  43.                         newsgroup, to, date, or subject field.
  44.                         (for example, have custom headers or SIG
  45.                         files for particular newsgroups)
  46.         - User defined substitution code table to create "macros" from
  47.           the above tags, create custom abbreviations, or correct common
  48.           spelling errors.
  49.         - Optionally strip unused header entries when starting editor
  50.  
  51.    Yep is extremely configurable. The author likes to think of it as a
  52.    program that can make every email an adventure! (-: It can be utilized
  53.    in a simple manner for basic functions (like setting start up cursor
  54.    positions), or in mind bogglingly complex customised craziness.
  55.  
  56.    It should be mentioned that there is already an excellent, and far
  57.    more comprehensive "editor shell" for Yarn which is called "Yes". My
  58.    reason for creating my own shell was mainly because there is no OS/2
  59.    version of Yes (at this time); and also creating my own shell I can
  60.    tailor it to my specific (and possibly insane) desires. I have no idea if
  61.    anyone else may find it useful to them, but here it is.
  62.  
  63.    And after all, you could set yourself up to use both Yep and Yes at the
  64.    same time, if you really want to. (-:
  65.  
  66.  
  67. -2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-
  68. Installation of Yep:
  69. -------------------
  70.  
  71.    It doesn't matter what directory you place YEP.EXE in, just as long
  72.    as the YEP.CFG is in the same directory.
  73.  
  74.    1. Edit your Yarn CONFIG file.
  75.  
  76.         Edit the line which begins "editor=". This line should now read:
  77.  
  78.                 editor=<path>\YEP.EXE
  79.  
  80.         where <path> is the path to wherever you placed the YEP.EXE.
  81.         Note: Yep should have no parameters on that line. You will
  82.         define the command line for you editor in the YEP.CFG file.
  83.  
  84.    2. Edit your YEP.CFG file.
  85.  
  86.         There are comments in this file (all lines beginning with a
  87.         semi-colon (;) are comment lines), so not many details will be
  88.         given in this document. Refer to the Yep.Cfg for instruction.
  89.  
  90.         You may use multiple copies of YEP for different users of yarn
  91.         on your system. The YEP will always look for a CFG file that has
  92.         the same root name as itself. Therefore if you made another
  93.         copy of Yep and called it YEP2.EXE you would then create a
  94.         YEP2.CFG file, which could have it's own set up.
  95.  
  96.         In the Yep.Cfg if you specify the full path (and EXE extension)
  97.         of your editor it will be called directly and speed up loading
  98.         a bit. Otherwise it is called though the command shell and your
  99.         path is searched.
  100.  
  101.    That's all there is to basic installation. How you use and customize
  102.    Yep is up to you.
  103.  
  104.  
  105. -3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-
  106. Tags & Substitution:
  107. -------------------
  108.  
  109.    A major concept of Yep is that of it's "macro" tags. Each message is
  110.    scanned for substitutions and tags before the editor starts, as well
  111.    as after the editor exits.  There are at this time only a few tags
  112.    implemented (but many things can be done with them).
  113.  
  114.    All of the tags so far implemented are (in alphabetical order):
  115.  
  116.         EXEC:, IFDATE:, IFFLAG:, IFNG:, IFSUBJ:, IFTO:,
  117.         IMPF:, IMPL:, RNDF:, RNDL:, SETFLAG:
  118.  
  119.    The basic syntax for tags are:
  120.  
  121.         {TAG:arguments}
  122.  
  123.    TAG is the name of the tag to be used, followed by a colon, followed
  124.    immediately by information that the tag is to work with. Tags are
  125.    not case sensitive-- they can be upper or lower or mixed case.
  126.  
  127.    Tags and substitutions are scanned sequentially on each line and
  128.    therefore nesting (tags within tags) will not work. However all
  129.    substitutions are done before any tags are interpreted, therefore
  130.    you can put substitution codes inside tags (i'm not sure what for).
  131.  
  132.    Yep attempts to "translate" or "filter" all text that goes though
  133.    it. It can get somewhat complex, but you can also include tags in
  134.    imported files, and they will be honoured.
  135.  
  136.  
  137.    {RNDL:filename}
  138.  
  139.         This tag will import a random line from the text file
  140.         specified. The file can be of any length. Blank lines and
  141.         lines beginning with a semi-colon (;) in the file will be
  142.         ignored.
  143.  
  144.         This tag is useful for creating random "taglines" in your sig,
  145.         or a random line in a header. It may have many other uses as
  146.         well-- but that is up to you, and your imagination.
  147.  
  148.         For example, if in your YEP.CFG you had a header line like
  149.         this:
  150.  
  151.                 X-Funny-Line: {RNDL:funny.txt}
  152.  
  153.         In the above example the "X-Funny-Line:" header would be
  154.         included in your message and a random line from a text file
  155.         called "funny.txt" would follow it.
  156.  
  157.  
  158.    {RNDF:filename}
  159.  
  160.         This tag inserts a random file. The "filename" specified will
  161.         be considered a "root" or "base" filename (ie. the filename
  162.         WITHOUT any extension). The directory containing the filename
  163.         root will be scanned looking for files with that name having
  164.         numbered extensions .1, .2, .3, and so on. The extension
  165.         numbers must be sequential, with no gaps. A random file will
  166.         be picked and inserted.
  167.  
  168.  
  169.    {IMPF:filename}
  170.  
  171.         Very simply imports the "filename" file into your message.
  172.         It could be useful for inserting external files into a SIG,
  173.         or other places. For example, some people like to include
  174.         their PGP key in their sig. You could do that by including
  175.         {ImpF:c:\pgp\mykey.asc} in your SIG file (note: Yep does not
  176.         append a SIG file itself, but interprets the SIG file that
  177.         Yarn appends to each message). In this way if you upgrade
  178.         PGP to a new version and export a new key to the filename
  179.         noted above, your sig will always automatically have the
  180.         latest extracted version of your key.
  181.  
  182.  
  183.    {EXEC:filename arguments}
  184.  
  185.         This causes your message to stop and execute a file. The
  186.         idea here is that you might have a file which output some
  187.         text you would like to insert into the message: perhaps
  188.         random quotations, or up to the second system statistics.
  189.         You can execute the file with this tag and redirect the
  190.         output to a temporary file, and then use the IMPF tag to
  191.         read in the newly created temporary file.
  192.  
  193.         See the Yep.Cfg file for a few examples of this.
  194.  
  195.         As with the text editor configuration, if you specify
  196.         a full path (with EXE extension) for your filename to
  197.         EXEC then the program will be called directly, which
  198.         speeds things up. Otherwise the file is run though the
  199.         command processor and path is searched.
  200.  
  201.         Note: if you are using the EXEC tag to capture output
  202.         using standard I/O redirection, do NOT include the EXE
  203.         on the path/filename, as the program must be executed
  204.         indirectly through your command processor in order to do
  205.         standard output redirection. (See below in the "substitutions"
  206.         section for more details).
  207.  
  208.  
  209.    {IMPL:#:filename}
  210.  
  211.         Perhaps there is a text file from which is only wanted a
  212.         single specific line of text (for example: to grab a line
  213.         of information from the output of a text file generated
  214.         by some other program}. With the ImpL tag you specify the
  215.         line number you wish to read where the # is (do not include
  216.         a # symbol), followed by a colon (:), and the filename.
  217.  
  218.         As an example: perhaps in your mail headers you would like
  219.         to display to the world how long your computer has been
  220.         running. There is a nice utility called "Go" by Carston Wimmer
  221.         (ftp://hobbes.nmsu.edu/os2/textutil/go_15.zip) which will
  222.         display OS/2's "up time" (and will do much more). However
  223.         the output of Go also includes title/copyright line of text
  224.         which you don't want to import: all you want is the "up time"
  225.         reported on line 3 of Go's report.
  226.  
  227.         The output of "go -ut" might look like this:
  228.  
  229.    GO! v1.5 - (c) 1993-95 by Carsten Wimmer <cawim@train.oche.de>
  230.  
  231.    Uptime:  1d 23h 56m 59s 364ms
  232.  
  233.         Therefore you might include in your yep.cfg a header
  234.         definition which would look like this:
  235.  
  236.                 X-{exec:go -ut >utmp}{impL:3:utmp}
  237.  
  238.         The first tag in the above example executes the "Go" utility
  239.         with the "-ut" switch and redirects the output to a work file
  240.         called "utmp". The next tag then directs Yep to import line
  241.         three, and only line three, of the work file that was created.
  242.  
  243.         Note also that the output of Go, with the -ut switch, includes
  244.         a header-like "Uptime:", so in our example the fine output of
  245.         your header would look like this:
  246.  
  247.                 X-Uptime:  1d 23h 56m 59s 364ms
  248.  
  249.  
  250.  
  251. Substitutions:
  252. -------------
  253.    It would be rather awkward if you had to type in then entire tag,
  254.    with filenames, and whatever other data that needs to be given,
  255.    therefore you can define your own tags by using a substitution table.
  256.  
  257.    In the Yep.Cfg you may define (currently) up to 100 substitutions.
  258.  
  259.    For example, say you wanted a quick way to import your PGP public
  260.    key into a message when someone asks for it. Rather than typing:
  261.    {impf:c:\pgp\my.key}, you could set up a substitution in the Yep.Cfg
  262.    something like this (refer to Yep.Cfg for details on the format):
  263.  
  264.         "{pk}"::"{impf:c:\pgp\my.key}"
  265.  
  266.    Now whenever you want to insert your PGP public key you would only
  267.    need to quickly type {pk} in your message and it would be inserted.
  268.    This is just an example, you could make it whatever you wanted.
  269.  
  270.    For another example, silly as it may be, say you had a fetish about
  271.    how much disk drive space you have free at any given moment, and you
  272.    are obsessed with telling everyone in every message how much drive
  273.    space is available that very second. You could define a substitution
  274.    something like so (assuming you have a utility called "free" which
  275.    reports current free disk space):
  276.  
  277.         "{ds}"::"{exec:free >tmp}{impf:tmp}"
  278.  
  279.    In this way the "free" command is executed and its output is
  280.    redirected to a temporary text file which is then imported into
  281.    your message. (Note: if you are going to use ">" redirection
  282.    to send output to a file, Yep needs to go through your OS command
  283.    interpreter shell-- in this case do not include a full path to
  284.    your program, as directly calls will not have redirected output.)
  285.  
  286.  
  287. -4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-
  288. Yep Operation Notes:
  289. -------------------
  290.  
  291.    Dot Translation:
  292.    ===============
  293.         When Yep runs you will see it announce itself, and then a
  294.         series of coloured dots. (This behaviour can be turned off in
  295.         the YEP.CFG if undesirable). Each dot tells which operation
  296.         Yep has just completed during it's scanning and filtering
  297.         activities. In this way you can tell how long certain
  298.         operations take, as well as possibly debug certain problems;
  299.         not to mention it's a form of cheep entertainment if you are
  300.         tired of watching television.
  301.  
  302.         Yep begins by announcing itself as "Yep...". This just tells you
  303.         the shell has started. After that dots follow:
  304.  
  305.         LIGHTBLUE - an user defined header line has been inserted.
  306.  
  307.         LIGHTGREEN - a substitution action has taken place.
  308.  
  309.         GREEN - A random line (RNDL) has been fetched (BLUE if it fails).
  310.  
  311.         BROWN - Yep has successfully imported a text file (IMPF/IMPR).
  312.  
  313.         YELLOW - Yep has attempted to import a text file but failed.
  314.  
  315.         GRAY - this is a potentially important dot: it indicates that
  316.                yep is about to execute (EXEC) a program. A DARK grey dot
  317.                means it is attempting to execute the program directly, a
  318.                LIGHT gray dot means it is executing through your OS shell.
  319.                This dot also shows up immediately before the Editor is
  320.                called, so the user can see how quickly Yep pre-processes
  321.                the file, and calls the editor (depending on system speed).
  322.  
  323.         BLUE - is a general error, and an error usually is given.
  324.  
  325.         After you finish editing your message Yep scans the message for
  326.         any new processing instructions. The above colours apply. When
  327.         it is finished it signs off with "...Yep" and returns you to Yarn.
  328.  
  329.  
  330.    Mailing Lists:
  331.    =============
  332.         Rather a cheap hack, but one could, if one wanted, create a
  333.         file with a comma separated list of addresses. Then create a
  334.         substitution code which loads that file, something like:
  335.  
  336.                 "{list1}"::"{IMPF:c:\yarn\MailLst1}"
  337.  
  338.         With this set up you only need to type {list1} in the Bcc: or
  339.         Cc: field of your message and the list of addresses will be
  340.         imported/substituted, and therefore mailed to everyone.
  341.  
  342.         Alternately you can just define a substitution that has your
  343.         "mailing list" in it, and avoid having to import a file.
  344.  
  345.                 "{L2}"::"someone@somewhere.edu,another@addr.com"
  346.  
  347.         Note: addresses are separated by commas. In the above
  348.         example if you entered {l2} in the To:, Cc: or Bcc: field
  349.         of a message then it will be substituted with the comma
  350.         delimited list.
  351.  
  352.  
  353.    SIG-gy Tricks:
  354.    =============
  355.         Note: Yep does not append a SIG file, but relies on Yarn
  356.         to append the SIG file. Yep however interprets whatever
  357.         it finds in Yarn's SIG file allowing for many tricks.
  358.  
  359.         Using various substitution codes you can do quite flexible
  360.         things with your SIG file. Not only can you have complete
  361.         randomly chosen SIG files, and link external files, but
  362.         individual elements inside your SIG can be randomized via
  363.         the RNDL tag. For example, my current SIG file looks like
  364.         this (this is just one small example of the possibilities):
  365.  
  366. {rndl:c:\osu\yarn\sig1top.lst}
  367.   Tim Middleton {rndl:c:\osu\yarn\sig1luv.lst} as544@torfree.net
  368. {rndl:c:\osu\yarn\sig1red.lst}
  369. {rndl:c:\osu\yarn\sig1end.lst}
  370.  
  371.         What it does is gets a random top element from a list,
  372.         then prints my name, inserts another random element from
  373.         a different list, and then my email address. Furthermore,
  374.         it then inserts another randomly chosen line, and finally
  375.         a randomly chosen bottom element. The finally output
  376.         might look like this (call me crazy, I love randomness!):
  377.  
  378.  .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.
  379.   Tim Middleton -with love and tomato sandwiches- as544@torfree.net
  380.   -=-= brace yourself and read The Idiot by Fyodor Dostoyevsky =-=-
  381.  ~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~`'~
  382.  
  383.  
  384. -5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-
  385. Of Conditional Tags:
  386. -------------------
  387.  
  388.         The idea here is to give the user even more automated
  389.         customization of their messages. For example, with conditional
  390.         tags you can implement different SIGs based on the newsgroup
  391.         being posted to. Or custom header lines based on who the
  392.         message is To. This seemed like a good idea to me when I
  393.         started working on it. Now I'm not sure if it's worth the
  394.         trouble. You can safely ignore it if it doesn't sound useful
  395.         to you.
  396.  
  397.         The way these tags work is that if the condition in them is
  398.         met (ie. if it is true) then the rest of the line will be
  399.         filtered through, otherwise the rest of the line will be
  400.         discarded. If the conditional tag begins in column one and
  401.         returns false then the entire line will be skipped.
  402.  
  403.         The new tags are:
  404.  
  405.    {IFTO:any text}
  406.  
  407.         If the text specified in the "any text" is found in the To:
  408.         field of the header then the rest of the line is processed.
  409.  
  410.  
  411.    {IFSUBJ:any text}
  412.  
  413.         Same as above, only the Subject: field is checked.
  414.  
  415.  
  416.    {IFDATE:any text}
  417.  
  418.         Same as above, only the Date: field is checked. Perhaps you
  419.         want special text automatically inserted into your messages
  420.         on Fridays. I have no idea why!
  421.  
  422.  
  423.    {IFNG:any text}
  424.  
  425.         Same as above, only the Newsgroups: field is checked. This
  426.         one is possibly the most potentially useful; allowing custom
  427.         headers or footer messages to be inserted when posting in
  428.         certain newsgroups. Maybe. (For an example of how to use
  429.         specific SIGs on individual newsgroups see IFFLAG below).
  430.  
  431.  
  432.    {IFFLAG:true/false}
  433.  
  434.         This tag needs a little more explanation. Consider the following
  435.         example Yarn SIG file (explanation to follow):
  436.  
  437.                 {IfNG:comp.os2}{ImpF:c:\yarn\os2.sig}
  438.                 {IfNG:comp.windows}{ImpF:c:\yarn\wind.sig}
  439.                 {IfNG:alt.books}{ImpF:c:\yarn\book.sig}
  440.                 {IfFlag:false}{IfTO:peri strange}{ImpF:c:\yarn\peri.sig}
  441.                 {ifFlag:false}{ImpF:c:\yarn\default.sig}
  442.  
  443.         As you have hopefully noticed, this example sig tests to see
  444.         if the user is posting in the various newsgroups: comp.os.*,
  445.         comp.windows.*, and alt.books.*; and if so then imports the
  446.         appropriate SIG file you have created.
  447.  
  448.         There is a global "FLAG" which begins always set to "false".
  449.         Whenever a conditional tag returns a "true" status the global
  450.         flag is set to "TRUE". Therefore in line four of the above SIG
  451.         example, you are first testing to see if any of the above
  452.         conditions have already been met. If they have then the rest
  453.         of line four is skipped. If a sig has not yet been imported (so
  454.         the global flag is still False) then it is checked to see if
  455.         the message is to your good friend "Peri Strange"-- who gets
  456.         his own sig to amuse him. Finally on the last line it is checked
  457.         again if no other conditions returned true this line will use the
  458.         "random file" tag to import a default SIG file with the name as
  459.         specified. (see the {IMPF:filename} tag in section 3).
  460.  
  461.         Lines beginning with an "if" tag as the first thing on the line
  462.         will not output anything (ie. will not leave a blank line) if
  463.         any conditions being tested fail before any text is printed.
  464.  
  465.  
  466.    {SETFLAG:true/false}
  467.  
  468.         There might be some circumstance, however unlikely, where you
  469.         need to set or reset the global flag. An example would be if you
  470.         have custom headers that test for certain dates or newsgroups,
  471.         and then at the bottom of the message have a SIG that does more
  472.         tests. To reset the global flag to FALSE simply put the following
  473.         tag on a line starting in column one:
  474.  
  475.                 {SetFlag:false}
  476.  
  477.         The line will be skipped in the message output, but the flag will
  478.         be set to False at that point.
  479.  
  480.  
  481. -6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-
  482. History of Revision:
  483. -------------------
  484.  
  485. Version 1.3 - February 13, 1996
  486. -----------
  487.         - new tag "Import Line Number" {ImpL:#:filename} - will import
  488.           a specified line number of a text file. See section 3.
  489.         - a bug in the "IfFlag" logic found and fixed [thanks to
  490.           cherylb@tiac.net (Cheryl Buzzell) for help finding this one].
  491.         - the bug that almost killed me! Many thanks to the longsuffering
  492.           tsawchuc@kestrel.punk.net (Tim Sawchuck) who reported the
  493.           strange and mysterious "teh"::"the" substitution bug. After
  494.           many, many trials and tribulations that could fill a long
  495.           novel, suffice it to say-- it turned out to have nothing to
  496.           do with that substitution (the symptom just shows up for Tim
  497.           during it, but the bug (corruption) happens earlier), and this
  498.           bug is officially (i hope) squashed, thank God, it nearly killed
  499.           me. The problem, precisely, occurred if you used substitutions
  500.           *IN* a custom header *AND* the replacement text was longer
  501.           than the original text. I hope that clears it up for everyone!
  502.         - faster, faster, faster. Yep should be noticeably faster
  503.           (modified scanning routines), especially on long messages.
  504.         - added a few more meaningful, english, error messages. (-;
  505.         - andrews@jolt.mpx.com.au (Andrew Shipton) finally noticed that 
  506.           Yep wasn't allowing Yarn 'score' files to get passed through to 
  507.           the editor. Doh! Fixed now, more or less! Sorry about that.
  508.         - better handling of {IfFlag:} and {SetFlag:} so that blank lines
  509.           are not left in a situation like this:
  510.  
  511.             {ifflag:false}{ifng:yarn}This is the yarn mail list.
  512.  
  513.           Previously if this "yarn" was not found in the newsgroups:
  514.           header then an awkward blank line would have been left behind.
  515.           No more. Should work much better with long lists of conditions
  516.           in SIGs or headers.
  517.  
  518.  
  519. Version 1.2 - February 4, 1996
  520. -----------
  521.         - very unfortunate bug that kept version 1.1 from running AT ALL
  522.           with the default yep.cfg due an error and bad parsing of the
  523.           [substitutions] section of yep.cfg. Fixed. Sorry! (If you
  524.           removed all blank lines from the yep.cfg it would work)
  525.  
  526.  
  527. Version 1.1 - January 31, 1996
  528. -----------
  529.         - the old 255 character per line limit is now 50,000.
  530.         - new yep.cfg directive: CleanHeader = "No"/"Yes" (see yep.cfg)
  531.           [thanks to suggestion by someone whom I lost the email of]
  532.         - new yep.cfg directive: ShowDots = "Yes"/"No" (see yep.cfg)
  533.         - $l (lower case L) in yep.cfg Editor= statement sets cursor
  534.           line number to the first line after the quotes in a reply.
  535.           [thanks to suggestion by lennart.carlson@mailbox.swipnet.se]
  536.         - bizarre new experimental conditional tags: please see section
  537.           5 of this document above for details if interested.
  538.         - custom header lines increased from 12 to 50
  539.         - maximum substitutions raised from 25 to 100
  540.         - new yep.cfg directive: CursorAdjust (see yep.cfg)
  541.  
  542. Version 1.0 - December 31, 1995
  543. -----------
  544.         - Released. Sort of.
  545.  
  546.  
  547. -7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-
  548. Credits:
  549. -------
  550.  
  551. Yarn off-line news/mail reader of DOS and OS/2 (the reason we are gathered
  552. here today, dearly beloved) is by Chin Huang. (ftp://ftp.oce.com/pub/yarn/)
  553.  
  554. Yes (Yarn Editor Shell) is by [it doesn't say until you run the install
  555. program which I don't feel like doing at the moment, but you can get it
  556. yourself and check it out as well at...] (ftp://ftp.oce.com/pub/yarn/)
  557.  
  558. And lastly and leastly there's me: Tim Middleton (as544@torfree.net)
  559.  
  560. Sorry if this documentation is a bit crappy and not explained well. (-:
  561.  
  562. [Here ends the documentation for YEP 1.3, February 13, 1996]
  563.  
  564.